package com.maijinjie.common.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

/**
 * 文件工具类
 * @version 1.0
 * @author GhostarX ( 王欣逸 ) 100992995@qq.com &copy;广州迈今捷信息科技有限公司
 */
public class FileUtil {

	/**
	 * 删除指定目录下的所有文件
	 * 
	 * @param folderPath
	 *            目录路径
	 * @return true:删除成功 false:删除失败
	 */
	public static boolean delAllFile(String folderPath) {
		boolean flag = false;
		File file = new File(folderPath);
		if (!file.exists()) {
			return flag;
		}
		if (!file.isDirectory()) {
			return flag;
		}
		String[] tempList = file.list();
		File temp = null;
		for (int i = 0; i < tempList.length; i++) {
			if (folderPath.endsWith(File.separator)) {
				temp = new File(folderPath + tempList[i]);
			} else {
				temp = new File(folderPath + File.separator + tempList[i]);
			}
			if (temp.isFile()) {
				temp.delete();
			}
			if (temp.isDirectory()) {
				delAllFile(folderPath + "/" + tempList[i]);// 先删除文件夹里面的文件
				delFolder(folderPath + "/" + tempList[i]);// 再删除空文件夹
				flag = true;
			}
		}
		return flag;
	}

	/**
	 * 删除指定文件
	 * @param filePath 指定文件的绝对路径
	 * @return true:删除成功 false:删除失败
	 */
	public static boolean delFile(String filePath) {
		boolean flag = false;
		File file = new File(filePath);
		if (!file.exists()) {
			return flag;
		}
		flag = file.delete();
		return flag;
	}
	/**
	 * 删除指定文件
	 * @param basicPath 文件所在根目录
	 * @param filePath 相对路径
	 * @return true:删除成功 false:删除失败
	 */
	public static boolean delFile(String basicPath, String filePath){
		boolean flag = false;
		File file = new File(basicPath + File.separator + filePath);
		if (!file.exists()) {
			return flag;
		}
		flag = file.delete();
		return flag;
	}

	/**
	 * 删除指定文件夹(包括文件夹下的所有文件)
	 * 
	 * @param folderPath
	 *            指定文件夹路径
	 * @return true:删除成功 false:删除失败
	 */
	public static boolean delFolder(String folderPath) {
		try {
			delAllFile(folderPath); // 删除完里面所有内容
			String filePath = folderPath;
			filePath = filePath.toString();
			java.io.File myFilePath = new java.io.File(filePath);
			myFilePath.delete(); // 删除空文件夹
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * 读取文本文件的内容
	 * 
	 * @param curfile
	 *            文本文件路径
	 * @return 返回文件内容
	 */
	public static String readFile(String curfile) {
		File f = new File(curfile);
		try {
			if (!f.exists())
				throw new Exception();
			FileReader cf = new FileReader(curfile);
			BufferedReader is = new BufferedReader(cf);
			String filecontent = "";
			String str = is.readLine();
			while (str != null) {
				filecontent += str;
				str = is.readLine();
				if (str != null)
					filecontent += "\n";
			}
			is.close();
			cf.close();
			return filecontent;
		} catch (Exception e) {
			System.err.println("不能读属性文件: " + curfile + " \n" + e.getMessage());
			return "";
		}

	}

	/**
	 * 取指定文件的扩展名
	 * 
	 * @param filePathName
	 *            文件路径
	 * @return 扩展名
	 */
	public static String getFileExt(String filePathName) {
		int pos = 0;
		pos = filePathName.lastIndexOf('.');
		if (pos != -1)
			return filePathName.substring(pos + 1, filePathName.length());
		else
			return "";

	}
	/**
	 * 取指定文件的扩展名
	 * 
	 * @param filePathName
	 *            文件路径
	 * @return 扩展名
	 */
	public static String getFileName(String filePathName) {
		if(null==filePathName){
			return null;
		} else {
			return filePathName.substring(filePathName.lastIndexOf("/")+1, filePathName.lastIndexOf("."));
		}
	}
	/**
	 * 获取路径中指定的文件夹路径
	 * @param path 路径
	 * @return String 文件夹路径
	 */
	public static String getFolderPath(String path){
		String fileName = null;
		if(-1!=path.lastIndexOf("\\")){
			fileName = path.substring(path.lastIndexOf("\\")+1, path.length());
		}
		if(-1!=fileName.lastIndexOf("/")){
			fileName = path.substring(path.lastIndexOf("/")+1, path.length());
		}
		return path.substring(0, path.length() - fileName.length());
	}
	/**
	 * 读取文件大小
	 * @param filename
	 * @return long 返回字节，1kb=1024字节
	 */
	public static long getFileSize(String filename) {
		try {
			return (long) new File(filename).length();
		} catch (Exception e) {
			return 0;
		}
	}

	/**
	 * 拷贝文件到指定目录
	 * 
	 * @param srcPath
	 *            源文件路径
	 * @param destPath
	 *            目标文件路径
	 * @return true:拷贝成功 false:拷贝失败
	 */
	public static boolean copyFile(String srcPath, String destPath) {
		FileInputStream is = null;
		FileOutputStream os = null;
		try {
			File f = new File(getFolderPath(destPath));
			if(!f.exists()){
				f.mkdirs();
			}
			
			File fl = new File(srcPath);
			int length = (int) fl.length();
			is = new FileInputStream(srcPath);
			os = new FileOutputStream(destPath);
			byte[] b = new byte[length];
			is.read(b);
			os.write(b);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			closeFileInputStream(is);
			closeFileOutputStream(os);
		}
	}
	/**
	 * 关闭文件输入流
	 * @param is
	 */
	public static void closeFileInputStream(FileInputStream is){
		try {
			if(null!=is)
				is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 关闭文件输出流
	 * @param os
	 */
	public static void closeFileOutputStream(FileOutputStream os){
		try {
			if(os!=null)
				os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 通过文件路径获取文件名
	 * @param filePath 文件路径
	 * @return String 文件名
	 */
	public static String getFileNameByFilePath(String filePath){
		String[] ss = filePath.split("\\\\");
		ss = ss[ss.length-1].split("/");
		return 1<ss.length?ss[ss.length-1]:ss[0];
	}
}